package sistema;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import callForPapers.CallForPaper;
import callForPapers.Paper;
import estadosUsuario.Logueado;

public class Sistema { // SINGLETON
	
	private static Sistema sistema;

	List<Usuario> usuarios;
	List<CallForPaper> cfps;

	//////////////////////////////////////////////////////////////////////
	
	// constructor
	// como es un singleton el metodo es PRIVATE
	// para instanciar la classe en vez de usar  "new Sistema()"
	// usar :  " Sistema.getInstance()"
	
	private Sistema() {
		this.usuarios = new ArrayList<Usuario>();
		this.cfps = new ArrayList<CallForPaper>();
		}

	////////////////////////////////////////////////////////////////////////
	
	// geters and setters
	
	public List<Usuario> getUsuarios() {
		return this.usuarios;
	}

	public List<CallForPaper> getCfps() {
		return this.cfps;
	}

	////////////////////////////////////////////////////////////////////////
	
	// singleton method

	public static Sistema getInstance() {
	
		if (sistema == null) {
			sistema = new Sistema();
			}
	
		return sistema;
}

	///////////////////////////////////////////////////////////////////////////
	
	// metodos
	
	public void hoyEsParaTodos() {
		Calendar hoy = Calendar.getInstance();
		for (CallForPaper cfpActual : this.cfps) {
			cfpActual.hoyEs(hoy);
		}
	}
	
	public void agregarUsuario(Usuario usuario) {
		this.usuarios.add(usuario);
	}

	public void agregarUsuario(String nombre, String apellido, String userName, String password, String email,
			Calendar fechaDeAlta, Set<AreaDeInteres> areasDeInteres) {
		this.usuarios.add(new Usuario(nombre, apellido, userName, password, email, fechaDeAlta, areasDeInteres));
	}
	
	public void agregarCfp(CallForPaper cfp) {
		if(this.noRepiteNombre(cfp)) {			
		this.cfps.add(cfp);
		}
	}

	private boolean noRepiteNombre(CallForPaper cfp) {
		for(CallForPaper cfpSistema : sistema.getCfps()) {
			if (cfpSistema.getNombre() == cfp.getNombre()) {
				return false;
			}
		}
		return true;
	}
	
	public Usuario loguearUsuario(String nombre, String pasword){

		Usuario usuarioAValidar;

		usuarioAValidar = this.devolverUsuario(nombre);

			if(usuarioAValidar != null && this.validarUsuario(usuarioAValidar,pasword)){
				usuarioAValidar.setEstado(new Logueado());
			}
		return usuarioAValidar;  // si no encuentra ningun usuario retorna un null........
		}

	private Usuario devolverUsuario(String nombre){

			for(Usuario usuario : this.getUsuarios()){
			if(usuario.getUserName() == nombre )
			return usuario;
			}
		return null;
		}

	private boolean validarUsuario(Usuario usuarioAValidar, String password ){

		return usuarioAValidar.getPassword() == password ;
		}

	public CallForPaper cfpAlQuePertenezco(Paper paper) {
		
		CallForPaper cfpEncontrado = null;
		CallForPaper cfpActual;
		
		Iterator<CallForPaper> cfpIterator = this.getCfps().iterator();
		
		while(cfpIterator.hasNext() && cfpEncontrado == null){
			cfpActual = cfpIterator.next();
			
			if(cfpActual.getPapers().contains(paper)){
				cfpEncontrado = cfpActual;
			}
		}
		
		
		return cfpEncontrado;
	}

	public Set<Paper> papersAutor(Usuario usuario) {
		
		
		
		Set<Paper> papersEncontrado = new HashSet<Paper>();
		CallForPaper cfpActual;
		Paper paperActual;
		
		Iterator<CallForPaper> cfpIterator = this.getCfps().iterator();
		
		while(cfpIterator.hasNext()){
			
			cfpActual = cfpIterator.next();
			
			Iterator<Paper> paperIterator = cfpActual.getPapers().iterator();
			
			while(paperIterator.hasNext()){
				
				paperActual = paperIterator.next();
				
				if( paperActual.getAutor() == usuario ){
					
					papersEncontrado.add(paperActual);
				}
			}
			
		}
		
		
		return papersEncontrado;
		
		
		}

}